# 远程连接服务器管理脚本 paramiko模块
# 1、连接远程服务器 执行命令
# 2、文件的上传下载
# 3、命令行菜单可以选择
# 呀 可能有bug 还得继续修复
# 导入模块
import paramiko
# 定义一个远程管理的类


class RemoteServer():
    # 类变量
    port = 22
    # 初始化赋值

    def __init__(self, host, username, password):
        # 连接远程主机需要用的参数
        # 主机名称 端口  用户名 密码
        self.host = host
        self.username = username
        self.password = password

    # 连接服务器  远程执行命令
    def remote_exec(self, command):
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy)
        ssh.connect(self.host, self.port, self.username, self.password)
        stdin, stdout, stderr = ssh.exec_command(command)
        return stdout.read().decode()
        # print(stdout)
    # 上传下载文件操作

    def remote_file(self, choice1, local_path, remote_path):
        # 建立sftp连接
        trans = paramiko.Transport(self.host, self.port)
        trans.connect(username=self.username, password=self.password)
        sftp = paramiko.SFTPClient.from_transport(trans)
        # 判断上传和下载
        if choice1 == 1:
            # 上传
            sftp.put(local_path, remote_path)
        else:
            # 下载
            sftp.get(remote_path, local_path)

# 1、输入主机IP和用户名称和密码
host = input('主机IP:')
username = input('用户名称:')
password = input('密码:')
remote_server = RemoteServer(host, username, password)

# 不断的显示菜单不退出
while True:
    # 使用步骤和过程
    print('*'*20)
    print('1、远程命令执行')
    print('2、远程文件管理')
    print('3、启动nginx')
    print('4、退出菜单')
    print('*'*20)
    # 2、根据菜单情况判断调用对应方法
    choice = int(input('请选择执行的操作数字:'))
    # 默认收到的str
    if choice == 1:
        command = input('执行命令:')
        print(remote_server.remote_exec(command))
    elif choice == 2:
        print('*'*10)
        print('1、上传文件')-
        print('2、下载文件')
        print('*'*10)
        choice1 = int(input('选择文件管理方式:'))
        local_path = input('本地路径:')
        remote_path = input('远程路径:')
        remote_server.remote_file(choice1, local_path, remote_path)
    elif choice == 3:
        remote_server.remote_exec('systemctl start nginx')
    else:
        exit()
